home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Visual Database / Visual Foxpro 6.0 (Ent. Edition) / Vf6ent Extractor.EXE / TOOLS / XSOURCE / XSOURCE.ZIP / vfpsource / wizards / Wzapp / wzapp.PRG < prev    next >
Encoding:
Text File  |  1998-05-01  |  39.9 KB  |  1,429 lines

  1. * APPWIZ.PRG - Application Wizard.
  2. *
  3. * Copyright (c) 1996-1997 Microsoft Corp.
  4. * 1 Microsoft Way
  5. * Redmond, WA 98052
  6. *
  7. * Description:
  8. * Application Wizard.
  9. *
  10.  
  11. #INCLUDE "wzapp.h"
  12. * WZAPP.H - Header file for Application Wizard files.
  13. *
  14.  
  15. LPARAMETERS tcOutFileVarName,p2,p3,p4,p5,p6,p7,p8,p9
  16. LOCAL lcLastSetTalk,lcLastSetSafety,lnLastTypeAhead
  17. LOCAL lcFileName,lcFileName2,lcFileName3,lnFileCount,lcWizardDir,lnCount
  18. PRIVATE lcProgramName
  19. LOCAL laDir[1],laFiles[1]
  20.  
  21. lcLastSetTalk=SET("TALK")
  22. SET TALK OFF
  23. lcLastSetSafety=SET("SAFETY")
  24. SET SAFETY OFF
  25. lnLastTypeAhead=SET("TYPEAHEAD")
  26. SET TYPEAHEAD TO 255
  27. lcProgramName=ProgramName()
  28. DO WHILE ADIR(laDir,"","D")=0
  29.     CD ..
  30. ENDDO
  31. lcWizardDir=HOME()+"WIZARDS\"
  32. lnFileCount=10
  33. DIMENSION laFiles[lnFileCount]
  34. laFiles[1]="APPWIZ.DBF"
  35. laFiles[2]="APPWIZ.FPT"
  36. laFiles[3]="APPWIZ.MNX"
  37. laFiles[4]="APPWIZ.MNT"
  38. laFiles[5]="APPWIZ.PJX"
  39. laFiles[6]="APPWIZ.PJT"
  40. laFiles[7]="APPWIZ.VCX"
  41. laFiles[8]="APPWIZ.VCT"
  42. laFiles[9]="APPWIZ.H"
  43. laFiles[10]="FOXQSTRT.BMP"
  44. FOR lnCount = 1 TO lnFileCount
  45.     lcFileName=laFiles[lnCount]
  46.     lcFileName2=lcWizardDir+lcFileName
  47.     lcFileName=UPPER(FULLPATH(lcFileName))
  48.     IF EMPTY(SYS(2000,lcFileName2)) AND FILE(lcFileName)
  49.         IF RIGHTC(lcFileName,4)==".TXT" OR RIGHTC(lcFileName,2)==".H" OR ;
  50.                 RIGHTC(lcFileName,4)==".BMP"
  51.             CREATE CURSOR _temp000 (Text M)
  52.             APPEND BLANK
  53.             APPEND MEMO Text FROM (lcFileName) OVERWRITE
  54.             COPY MEMO Text TO (lcFileName2)
  55.             USE
  56.         ELSE
  57.             IF (lnCount/2)=INT(lnCount/2)
  58.                 LOOP
  59.             ENDIF
  60.             lcFileName3=lcWizardDir+"temp0000"+RIGHTC(lcFileName,4)
  61.             ERASE (lcFileName3)
  62.             SELECT 0
  63.             USE (lcFileName)
  64.             COPY TO (lcFileName3)
  65.             USE
  66.             RENAME (lcFileName3) TO (lcWizardDir+laFiles[lnCount])
  67.             lcFileName=laFiles[lnCount+1]
  68.             lcFileName3=lcWizardDir+"temp0000"+RIGHTC(lcFileName,4)
  69.             RENAME (lcFileName3) TO (lcWizardDir+lcFileName)
  70.         ENDIF
  71.     ENDIF
  72. ENDFOR
  73. DO wzastart WITH tcOutFileVarName,p2,p3,p4,p5,p6,p7,p8,p9
  74. SET TYPEAHEAD TO (lnLastTypeAhead)
  75. IF lcLastSetSafety=="ON"
  76.     SET SAFETY ON
  77. ELSE
  78.     SET SAFETY OFF
  79. ENDIF
  80. IF lcLastSetTalk=="ON"
  81.     SET TALK ON
  82. ELSE
  83.     SET TALK OFF
  84. ENDIF
  85. RETURN
  86.  
  87.  
  88. FUNCTION ProgramName
  89. LOCAL lcProgramName,lnAtPos
  90.  
  91. lcProgramName=LOWER(SYS(16))
  92. lnAtPos=RATC(" ",lcProgramName)
  93. IF lnAtPos>0
  94.     lcProgramName=ALLTRIM(SUBSTRC(lcProgramName,lnAtPos+1))
  95. ENDIF
  96. RETURN lcProgramName
  97. ENDFUNC
  98.  
  99.  
  100. FUNCTION AppWizFinish(oAppWiz,tlNoRelease)
  101. LOCAL oFinish,llComplete
  102.  
  103. ACTIVATE SCREEN
  104. SET PROCEDURE TO wzengine ADDITIVE
  105. oFinish=CREATEOBJECT("GenerateApplication")
  106. IF TYPE("oFinish")#"O" OR ISNULL(oFinish)
  107.     RETURN .F.
  108. ENDIF
  109. llComplete=oFinish.Do(oAppWiz,tlNoRelease)
  110. IF tlNoRelease OR TYPE("oFinish")#"O" OR ISNULL(oFinish)
  111.     RETURN .F.
  112. ENDIF
  113. RETURN llComplete
  114. ENDFUNC
  115.  
  116.  
  117.  
  118. FUNCTION AutoApp(oAppWiz)
  119. LOCAL oAutoApp
  120.  
  121. oAutoApp=oAppWiz.oAutoApp
  122. WITH oAppWiz.Form1
  123.     WITH .Pageframe1.Page1.Pageframe1
  124.         WITH .Page1
  125.             .opgAppType.Value=oAutoApp.nProjectType
  126.             .opgAppType.InteractiveChange
  127.             .txtProjectName.Value=oAutoApp.cProjectName
  128.             .txtProjectName.Valid
  129.             .txtProjectFile.Value=oAutoApp.cOutFile
  130.             .txtProjectFile.Valid
  131.             .chkCreateProjDir.Value=oAutoApp.lCreateDir
  132.             .chkCreateProjDir.InteractiveChange
  133.         ENDWITH
  134.     ENDWITH
  135.     .cmdNext.Click
  136.     WITH .Pageframe1.Page1.Pageframe1
  137.         WITH .Page2
  138.             .opgDatabase.Value=oAutoApp.nDatabaseType
  139.             .opgDatabase.InteractiveChange
  140.             .txtExistingDatabase.Value=oAutoApp.cExistingDBC
  141.             .txtExistingDatabase.Valid
  142.             .cboNewDatabase.Value=oAutoApp.cDatabaseTemplate
  143.             .cboNewDatabase.Valid
  144.         ENDWITH
  145.     ENDWITH
  146.     .cmdNext.Click
  147.     .cmdNext.Click
  148.     .cmdNext.Click
  149.     WITH .Pageframe1.Page2
  150.         .opgSave.Value=oAutoApp.nWizAction
  151.         .opgSave.InteractiveChange
  152.     ENDWITH
  153. ENDWITH
  154. ENDFUNC
  155.  
  156.  
  157.  
  158. DEFINE CLASS GenerateApplicationTest AS GenerateApplication
  159.  
  160.  
  161.     FUNCTION Init
  162.     ENDFUNC
  163.  
  164.  
  165.     FUNCTION Cleanup
  166.     ENDFUNC
  167.  
  168.  
  169. ENDDEFINE
  170.  
  171.  
  172. DEFINE CLASS GenerateApplication AS WizEngineAll
  173.  
  174.  
  175.     oAppWiz=.NULL.
  176.     oPageFrame=.NULL.
  177.     lFrameworkOnly=.F.
  178.     l98Framework=.F.
  179.     cProjectName=""
  180.     cMainPJX=""
  181.     cMainAPP=""
  182.     cMainERR=""
  183.     lCreateProjDir=.F.
  184.     cProjectDir=""
  185.     cProjectBaseFileName=""
  186.     nSaveMode=1
  187.     cStartupMenu=""
  188.     cStartupForm=""
  189.     cLastDir=""
  190.     cWizardDir=""
  191.     cWizardDir2=""
  192.     cAppWizVCX=""
  193.     cMainVCX=""
  194.     cMainPRG=""
  195.     cMainH=""
  196.     cAboutSCX=""
  197.     cQuickStartSCX=""
  198.     lExistingDatabase=.F.
  199.     cExistingDatabase=""
  200.     cLastSetPath=""
  201.     nLastSelect=0
  202.     nDocumentCount=0
  203.     nMenuCount=0
  204.     lError=.F.
  205.     lBuildMode=.F.
  206.     cMessageText=""
  207.     nDBCCount=0
  208.     cHeaderText=""
  209.     
  210.     DIMENSION aDBC[1]
  211.  
  212.     FUNCTION Destroy
  213.  
  214.     SET PATH TO (this.cLastSetPath)
  215.     SET MESSAGE TO ""
  216.     IF USED("_appwiz")
  217.         USE IN _appwiz
  218.     ENDIF
  219.     IF USED("project")
  220.         SELECT _project
  221.         PACK
  222.         USE
  223.     ENDIF
  224.     IF USED("_menu")
  225.         SELECT _menu
  226.         PACK
  227.         USE
  228.     ENDIF
  229.     IF USED("_templatedbf")
  230.         SELECT _templatedbf
  231.         USE
  232.     ENDIF
  233.     SELECT (this.nLastSelect)
  234.     SET MESSAGE TO
  235.     DODEFAULT()
  236.     ENDFUNC
  237.  
  238.  
  239.     FUNCTION Do(oAppWiz,tlNoRelease)
  240.     LOCAL lnCount,lcText,lcWindowName,lcFileName,llDuplicate,lnCheckCount,lcNewBaseName
  241.     LOCAL lnAtPos,lnLastSelect,lcTableName
  242.  
  243.     this.oAppWiz=oAppWiz
  244.     oAppWiz=.NULL.
  245.     IF TYPE("this.oAppWiz.Form1.Pageframe1.Page1.Pageframe1")=="O"
  246.         this.oPageFrame=this.oAppWiz.Form1.Pageframe1.Page1.Pageframe1
  247.     ELSE
  248.         this.oPageFrame=this.oAppWiz.Form1.Pageframe1
  249.     ENDIF
  250.     CLEAR TYPEAHEAD
  251.     WAIT CLEAR
  252.     SET MESSAGE TO ""
  253.     this.cLastSetPath=SET("PATH")
  254.     this.nLastSelect=SELECT()
  255.     IF USED("_project")
  256.         USE IN _project
  257.     ENDIF
  258.     this.cLastDir=LOWER(SYS(5)+CURDIR())
  259.     IF EMPTY(this.oAppWiz.ClassLibrary)
  260.         this.cWizardDir=this.oAppWiz.TrimFile(SYS(1271,this.oAppWiz))
  261.     ELSE
  262.         this.cWizardDir=this.oAppWiz.TrimFile(this.oAppWiz.ClassLibrary)
  263.     ENDIF
  264.  
  265.     this.cWizardDir2=HOME()+"wizards\"
  266.     IF EMPTY(this.cWizardDir)
  267.         this.cWizardDir=HOME()+"wizards\"
  268.     ENDIF
  269.     this.OpenAppWiz
  270.     IF NOT USED("_appwiz")
  271.         this.oAppWiz=.NULL.
  272.         this.oPageframe=.NULL.
  273.         RETURN .F.
  274.     ENDIF
  275.     this.lFrameworkOnly=(this.oPageFrame.Page1.opgAppType.Value>1)
  276.     this.l98Framework=(this.oPageFrame.Page1.opgAppType.Value=3)
  277.     this.cProjectName=ALLTRIM(this.oPageFrame.Page1.txtProjectName.Value)
  278.     lcText="Building "+IIF(this.nSaveMode=3,"application","project")+ ;
  279.             " "+this.cProjectName
  280.     this.cMessageText=lcText
  281.     SET MESSAGE TO (this.cMessageText+" ...")
  282.     this.cMainPJX=LOWER(ALLTRIM(FULLPATH(this.oPageFrame.Page1.txtProjectFile.Value)))
  283.     this.lExistingDatabase=(this.oPageFrame.Page2.opgDatabase.Value=1)
  284.     this.cExistingDatabase=ALLTRIM(this.oPageFrame.Page2.txtExistingDatabase.Value)
  285.     this.cProjectBaseFileName=ALLTRIM(this.oAppWiz.TrimPath(this.cMainPJX,.T.))
  286.     lcNewBaseName=this.cProjectBaseFileName
  287.     lnCheckCount=0
  288.     DO WHILE .T.
  289.         llDuplicate=.F.
  290.         lnCheckCount=lnCheckCount+1
  291.         FOR lnCount = 1 TO this.oPageFrame.Page3.oleDocumentList.object.Nodes.Count
  292.             lcFileName=LOWER(ALLTRIM(this.oPageFrame.Page3.oleDocumentList.object.Nodes[lnCount].Text))
  293.             IF NOT "."$lcFileName OR NOT ":"$lcFileName
  294.                 LOOP
  295.             ENDIF
  296.             lnAtPos=AT_C("(",lcFileName)
  297.             IF lnAtPos>0
  298.                 lcFileName=ALLTRIM(LEFTC(lcFileName,lnAtPos-1))
  299.             ENDIF
  300.             IF LOWER(lcNewBaseName)==this.oAppWiz.TrimPath(lcFileName,.T.)
  301.                 llDuplicate=.T.
  302.                 lcNewBaseName=this.cProjectBaseFileName+ALLTRIM(STR(lnCheckCount,4))
  303.                 EXIT
  304.             ENDIF
  305.         ENDFOR
  306.         IF NOT llDuplicate
  307.             EXIT
  308.         ENDIF
  309.     ENDDO
  310.     IF    NOT this.cProjectBaseFileName==lcNewBaseName
  311.         this.cProjectBaseFileName=lcNewBaseName
  312.     ENDIF
  313.     this.aDBC=""
  314.     lnLastSelect=SELECT()
  315.     FOR lnCount = 0 TO this.oPageFrame.Page3.oleDocumentList.object.Nodes.Count
  316.         IF lnCount=0
  317.             IF NOT this.lExistingDatabase OR EMPTY(this.cExistingDatabase)
  318.                 LOOP
  319.             ENDIF
  320.             lcFileName=this.cExistingDatabase
  321.         ELSE
  322.             lcFileName=LOWER(ALLTRIM(this.oPageFrame.Page3.oleDocumentList.object.Nodes[lnCount].Text))
  323.         ENDIF
  324.         lnAtPos=AT_C("(",lcFileName)
  325.         IF lnAtPos>0
  326.             lcFileName=ALLTRIM(LEFTC(lcFileName,lnAtPos-1))
  327.         ENDIF
  328.         lnAtPos=RATC(".",lcFileName)
  329.         lcFileExt=IIF(lnAtPos=0,"",LOWER(RIGHTC(lcFileName,LEN(lcFileName)-lnAtPos+1)))
  330.         IF NOT lcFileExt==".dbc" OR NOT FILE(lcFileName)
  331.             LOOP
  332.         ENDIF
  333.         SELECT 0
  334.         USE (lcFileName) AGAIN SHARED ALIAS _tempdbc
  335.         IF NOT USED()
  336.             SELECT (lnLastSelect)
  337.             LOOP
  338.         ENDIF
  339.         SCAN ALL FOR ALLTRIM(LOWER(ObjectType))=="table"
  340.             lcTableName=SUBSTRC(Property,16)
  341.             lnAtPos=AT_C(CHR(0),lcTableName)
  342.             IF lnAtPos=0
  343.                 LOOP
  344.             ENDIF
  345.             lcTableName=LOWER(ALLTRIM(LEFTC(lcTableName,lnAtPos-1)))
  346.             IF ASCAN(this.aDBC,lcTableName)>0
  347.                 LOOP
  348.             ENDIF
  349.             this.nDBCCount=this.nDBCCount+1
  350.             DIMENSION this.aDBC[this.nDBCCount]
  351.             this.aDBC[this.nDBCCount]=lcTableName
  352.         ENDSCAN
  353.         USE
  354.         SELECT (lnLastSelect)
  355.     ENDFOR
  356.     this.cMainAPP=this.oAppWiz.TrimExt(this.cMainPJX)+".app"
  357.     this.cMainERR=this.oAppWiz.TrimExt(this.cMainPJX)+".err"
  358.     this.lCreateProjDir=this.oPageFrame.Page1.chkCreateProjDir.Value
  359.     this.cProjectDir=this.oAppWiz.TrimFile(this.cMainPJX)
  360.     IF EMPTY(this.cProjectDir)
  361.         MESSAGEBOX("No project directory specified.",16,this.oAppWiz.Form1.Caption)
  362.         this.oAppWiz=.NULL.
  363.         this.oPageframe=.NULL.
  364.         RETURN .F.
  365.     ENDIF
  366.     IF NOT EMPTY(this.oAppWiz.cTemplateDBF) AND FILE(this.oAppWiz.cTemplateDBF)
  367.         lnLastSelect=SELECT()
  368.         SELECT 0
  369.         USE (this.oAppWiz.cTemplateDBF) AGAIN SHARED ALIAS _templatedbf
  370.         IF USED("_templatedbf")
  371.             IF TYPE("Name")=="U" OR TYPE("Properties")=="U"
  372.                 USE IN _templatedbf
  373.             ELSE
  374.                 SET FILTER TO NOT DELETED()
  375.                 LOCATE
  376.             ENDIF
  377.         ENDIF
  378.         SELECT (lnLastSelect)
  379.     ENDIF
  380.     IF TYPE("this.oAppWiz.Form1.Pageframe1.Page2.opgSave")=="O"
  381.         this.nSaveMode=this.oAppWiz.Form1.Pageframe1.Page2.opgSave.Value
  382.     ELSE
  383.         this.nSaveMode=this.oPageFrame.fpgFinish.opgSave.Value
  384.     ENDIF
  385.     
  386.     this.cStartupMenu=this.cProjectDir+this.GetDirName("menus")+ ;
  387.             this.cProjectBaseFileName+".mnx"
  388.     this.cAppWizVCX=this.cWizardDir+"appwiz.vcx"
  389.     this.cMainVCX=this.cProjectDir+this.GetDirName("libs")+ ;
  390.             this.cProjectBaseFileName+".vcx"
  391.     this.cMainPRG=this.cProjectDir+this.GetDirName("progs")+ ;
  392.             this.cProjectBaseFileName+".prg"
  393.     this.cMainH=this.cProjectDir+this.GetDirName("include")+ ;
  394.             this.cProjectBaseFileName+".h"
  395.     this.cAboutSCX=this.cProjectDir+this.GetDirName("forms")+ ;
  396.             "About.scx"
  397.     this.cQuickStartSCX=this.cProjectDir+this.GetDirName("forms")+ ;
  398.             "QckStart.scx"
  399.     IF NOT EMPTY(SYS(2000,this.cMainAPP))
  400.         CLEAR PROGRAM (this.cMainAPP)
  401.         ERASE (this.cMainAPP)
  402.     ENDIF
  403.     IF NOT EMPTY(SYS(2000,this.cMainERR))
  404.         lcWindowName=this.oAppWiz.TrimPath(this.cMainERR)
  405.         IF WEXIST(lcWindowName)
  406.             RELEASE WINDOW (lcWindowName)
  407.         ENDIF
  408.         ERASE (this.cMainERR)
  409.     ENDIF
  410.     IF NOT this.CreateApplication()
  411.         MESSAGEBOX(this.oAppWiz.Form1.Caption+" not completed.",16, ;
  412.                 this.oAppWiz.Form1.Caption)
  413.         this.oAppWiz=.NULL.
  414.         this.oPageframe=.NULL.
  415.         RETURN .F.
  416.     ENDIF
  417.     IF NOT tlNoRelease
  418.         this.oAppWiz.Hide
  419.     ENDIF
  420.     this.oAppWiz=.NULL.
  421.     this.oPageframe=.NULL.
  422.     CD (this.cProjectDir)
  423.     CLEAR TYPEAHEAD
  424.     DO CASE
  425.         CASE this.nSaveMode=1
  426.             this.BuildProject
  427.         CASE this.nSaveMode=2
  428.             this.BuildProject
  429.             this.ModifyProject
  430.         CASE this.nSaveMode=3
  431.             this.BuildApplication
  432.     ENDCASE
  433.     IF NOT this.DisplayErrorFile() AND this.nSaveMode=3
  434.         this.RunApplication
  435.     ENDIF
  436.     ENDFUNC
  437.  
  438.  
  439.     FUNCTION CreateApplication
  440.         
  441.     IF NOT this.CreateDirs() OR NOT this.CreateProject() OR ;
  442.             NOT this.UpdateProject()
  443.         RETURN .F.
  444.     ENDIF
  445.     ENDFUNC
  446.  
  447.  
  448.     FUNCTION BuildProject
  449.     LOCAL lnCount
  450.  
  451.     IF USED("_project")
  452.         SELECT _project
  453.         PACK
  454.         USE
  455.     ENDIF
  456.     IF USED("_menu")
  457.         SELECT _menu
  458.         PACK
  459.         USE
  460.     ENDIF
  461.     SELECT 0
  462.     SET MESSAGE TO
  463.     FOR lnCount = 1 TO 5000
  464.     ENDFOR
  465.     this.lBuildMode=.T.
  466.     BUILD PROJECT (this.cMainPJX)
  467.     this.lBuildMode=.F.
  468.     ENDFUNC
  469.  
  470.  
  471.     FUNCTION BuildApplication
  472.     LOCAL lcKeyboard,lcFileName,lcFileName2
  473.  
  474.     IF USED("_project")
  475.         SELECT _project
  476.         PACK
  477.         USE
  478.     ENDIF
  479.     IF USED("_menu")
  480.         SELECT _menu
  481.         PACK
  482.         USE
  483.     ENDIF
  484.     SELECT 0
  485.     SET MESSAGE TO
  486.     lcFileName=this.cMainAPP
  487.     IF " "$lcFileName
  488.         lcFileName=[("]+lcFileName+[")]
  489.     ENDIF
  490.     lcFileName2=this.cMainPJX
  491.     IF " "$lcFileName2
  492.         lcFileName2=[("]+lcFileName2+[")]
  493.     ENDIF
  494.     lcKeyboard=[{Ctrl+F2}{Ctrl+END}BUILD APP ]+lcFileName
  495.     KEYBOARD (lcKeyboard) PLAIN
  496.     lcKeyboard=[ FROM ]+lcFileName2+[{ENTER}]
  497.     KEYBOARD (lcKeyboard) PLAIN
  498.     CLEAR PROGRAM (this.cMainAPP)
  499.     ENDFUNC
  500.  
  501.  
  502.     FUNCTION ModifyProject
  503.     LOCAL lcKeyboard,lcFileName
  504.  
  505.     lcFileName=this.cMainPJX
  506.     IF " "$lcFileName
  507.         lcFileName=[("]+lcFileName+[")]
  508.     ENDIF
  509.     lcKeyboard=[{Ctrl+F2}{Ctrl+END}MODIFY PROJECT ]+lcFileName+[ NOWAIT{ENTER}]
  510.     KEYBOARD (lcKeyboard) PLAIN
  511.     ENDFUNC
  512.  
  513.  
  514.     FUNCTION RunApplication
  515.     LOCAL lcKeyboard,lcFileName
  516.  
  517.     IF USED("_project")
  518.         USE IN _project
  519.     ENDIF
  520.     lcFileName=this.cMainAPP
  521.     IF " "$lcFileName
  522.         lcFileName=[("]+lcFileName+[")]
  523.     ENDIF
  524.     lcKeyboard=[{Ctrl+F2}{Ctrl+END}DO ]+lcFileName+[{ENTER}]
  525.     KEYBOARD (lcKeyboard) PLAIN
  526.     ENDFUNC
  527.  
  528.  
  529.     FUNCTION DisplayErrorFile
  530.     
  531.     IF EMPTY(SYS(2000,this.cMainERR))
  532.         RETURN .F.
  533.     ENDIF
  534.     MODIFY FILE (this.cMainERR) NOWAIT
  535.     ENDFUNC
  536.  
  537.     FUNCTION CreateDirs
  538.     LOCAL lcLastDir
  539.     
  540.     this.CreateDir(this.cProjectDir)
  541.     IF this.lCreateProjDir
  542.         this.CreateDir(this.cProjectDir+this.GetDirName("data"))
  543.         this.CreateDir(this.cProjectDir+this.GetDirName("include"))
  544.         this.CreateDir(this.cProjectDir+this.GetDirName("forms"))
  545.         this.CreateDir(this.cProjectDir+this.GetDirName("graphics"))
  546.         this.CreateDir(this.cProjectDir+this.GetDirName("help"))
  547.         this.CreateDir(this.cProjectDir+this.GetDirName("libs"))
  548.         this.CreateDir(this.cProjectDir+this.GetDirName("menus"))
  549.         this.CreateDir(this.cProjectDir+this.GetDirName("progs"))
  550.         this.CreateDir(this.cProjectDir+this.GetDirName("reports"))
  551.        ENDIF
  552.     ENDFUNC
  553.  
  554.  
  555.     FUNCTION CreateDir(tcDir)
  556.     LOCAL laDir[1]
  557.     IF EMPTY(tcDir)
  558.         RETURN .F.
  559.     ENDIF
  560.     IF NOT RIGHTC(tcDir,2)==":\" AND ADIR(laDir,tcDir,"D")=0
  561.         MD (tcDir)
  562.     ENDIF
  563.     ENDFUNC
  564.  
  565.  
  566.     FUNCTION CreateProject
  567.     LOCAL lnLastSelect,lcFileName
  568.  
  569.     lcProjectWindow="Project Manager - "+this.oAppWiz.TrimPath(this.cMainPJX,.T.)
  570.     IF WEXIST(lcProjectWindow)
  571.         RELEASE WINDOW (lcProjectWindow)
  572.     ENDIF
  573.     SELECT 0
  574.     USE (this.cWizardDir+"appwiz.pjx") AGAIN SHARED
  575.     SET FILTER TO NOT DELETED()
  576.     LOCATE
  577.     COPY TO (this.cMainPJX)
  578.     USE
  579.     USE (this.cMainPJX) EXCLUSIVE ALIAS _project
  580.     IF NOT USED()
  581.         SELECT 0
  582.         WAIT CLEAR
  583.         MESSAGEBOX("Project file could not be created and opened.",16, ;
  584.                 this.oAppWiz.Form1.Caption)
  585.         RETURN .F.
  586.     ENDIF
  587.     REPLACE ALL SCCData WITH ""
  588.     SET FILTER TO NOT DELETED()
  589.     LOCATE FOR Type=="H"
  590.     REPLACE Name WITH this.cMainPJX+CHR(0), ;
  591.             HomeDir WITH this.cProjectDir+CHR(0), ;
  592.             Object WITH this.cProjectDir+CHR(0), ;
  593.             Reserved1 WITH this.cMainPJX+CHR(0)
  594.     SKIP
  595.     SCAN ALL FOR NOT EMPTY(Name) AND NOT Type=="H"
  596.         lcFileName=LOWER(ALLTRIM(STRTRAN(MLINE(Name,1),CHR(0),"")))
  597.         lcFileName=LOWER(SYS(2014,FULLPATH(lcFileName,this.cWizardDir),this.cProjectDir))
  598.         REPLACE Name WITH lcFileName+CHR(0)
  599.     ENDSCAN
  600.     IF THIS.l98Framework
  601.         LOCATE FOR ATC("foxqstrt",name)#0
  602.         IF FOUND()
  603.             DELETE
  604.             PACK
  605.         ENDIF
  606.     ENDIF
  607.     LOCATE
  608.     ENDFUNC
  609.  
  610.  
  611.     FUNCTION OpenAppWiz
  612.  
  613.     IF USED("_appwiz")
  614.         RETURN
  615.     ENDIF
  616.     SELECT 0
  617.     USE (this.cWizardDir+"appwiz") AGAIN SHARED ALIAS _appwiz
  618.     SET FILTER TO AppWizData AND NOT DELETED()
  619.     LOCATE
  620.     ENDFUNC
  621.  
  622.  
  623.     FUNCTION UpdateProject
  624.     IF THIS.l98Framework
  625.         THIS.UpdateProjectNew()
  626.         RETURN
  627.     ENDIF
  628.     LOCAL lcCode,lcInitCode,oTemp,lcLastSetClassLib,lcPath,lcData1,lcDirectory
  629.     
  630.     COPY FILE (this.cWizardDir+"foxqstrt.bmp") ;
  631.             TO (this.cProjectDir+this.GetDirName("graphics")+"foxqstrt.bmp")
  632.     COPY FILE (this.cWizardDir+"appwiz.h") TO (this.cMainH)
  633.     lcLastSetClassLib=SET("CLASSLIB")
  634.     SET CLASSLIB TO (this.cAppWizVCX) ADDITIVE
  635.     oTemp=CREATEOBJECT("wzApplication")
  636.     oTemp.SaveAsClass(this.cMainVCX,"cApplication","Application class.")
  637.     oTemp=.NULL.
  638.     oTemp=CREATEOBJECT("wzAboutDialog")
  639.     IF FILE(this.cAboutSCX)
  640.         ERASE (this.cAboutSCX)
  641.     ENDIF
  642.     oTemp.SaveAs(this.cAboutSCX)
  643.     oTemp=.NULL.
  644.     oTemp=CREATEOBJECT("wzQuickStartForm")
  645.     IF FILE(this.cQuickStartSCX)
  646.         ERASE (this.cQuickStartSCX)
  647.     ENDIF
  648.     oTemp.SaveAs(this.cQuickStartSCX)
  649.     oTemp=.NULL.
  650.     IF NOT SET("CLASSLIB")==lcLastSetClassLib
  651.         RELEASE CLASSLIB (this.cAppWizVCX)
  652.     ENDIF
  653.     SELECT 0
  654.     USE (this.cWizardDir+"appwiz.mnx") AGAIN SHARED
  655.     SET FILTER TO NOT DELETED()
  656.     LOCATE
  657.     COPY TO (this.cStartupMenu)
  658.     USE
  659.     IF NOT this.lFrameworkOnly
  660.         this.UpdateMenu
  661.         IF this.lExistingDatabase AND NOT EMPTY(this.cExistingDatabase)
  662.             this.AddProjectItem(this.cExistingDatabase,.T.)
  663.         ENDIF
  664.     ENDIF
  665.     this.AddProjectItem(this.cMainH,.T.)
  666.     this.AddProjectItem(this.cMainVCX)
  667.     this.AddProjectItem(this.cStartupMenu)
  668.     this.AddProjectItem(this.cAboutSCX,,,,.T.)
  669.     this.AddProjectItem(this.cQuickStartSCX,,,,.T.)
  670.     SELECT _appwiz
  671.     LOCATE FOR UPPER(ALLTRIM(Type))=="STARTUP PROGRAM"
  672.     lcCode=STRTRAN(ALLTRIM(Data1),LF,"")
  673.     lcInitCode=CR
  674.     lcInitCode=lcInitCode+[goApp.SetCaption("]+ ;
  675.             this.cProjectName+[")]+CR
  676.     IF NOT EMPTY(this.cStartupMenu)
  677.         this.cStartupMenu=LOWER(SYS(2014,this.oAppWiz.TrimExt(this.cStartupMenu), ;
  678.                 this.cProjectDir))
  679.     ENDIF
  680.     lcInitCode=lcInitCode+[goApp.cStartupMenu="]+this.cStartupMenu+["]+CR
  681.     IF NOT EMPTY(this.cStartupForm)
  682.         this.cStartupForm=LOWER(SYS(2014,this.oAppWiz.TrimExt(this.cStartupForm), ;
  683.                 this.cProjectDir))
  684.     ENDIF
  685.     lcInitCode=lcInitCode+[goApp.cStartupForm="]+this.cStartupForm+["]+CR
  686.     lcCode=STRTRAN(lcCode,CR+"*<Initalize>*"+CR,lcInitCode)
  687.     IF NOT EMPTY(this.cMainVCX)
  688.         this.cMainVCX=LOWER(SYS(2014,this.oAppWiz.TrimExt(this.cMainVCX),this.cProjectDir))
  689.     ENDIF
  690.     lcCode=STRTRAN(lcCode,"*<MAIN.VCX>*",this.cMainVCX)
  691.     lcCode=STRTRAN(lcCode,"*<Dummy project references>*","DO "+ ;
  692.             FORCEEXT(this.cStartupMenu,".mpx"))
  693.     lcDirectory=this.cProjectDir
  694.     IF LOWER(LEFTC(lcDirectory,2))==LOWER(LEFTC(this.cWizardDir,2))
  695.         lcDirectory=ALLTRIM(SUBSTRC(lcDirectory,3))
  696.     ENDIF
  697.     lcCode=STRTRAN(lcCode,"*<CDPath>*",lcDirectory)
  698.     lcCode=STRTRAN(lcCode,"*<MAIN.PRG>*",LOWER(SYS(2014,this.oAppWiz.TrimExt(this.cMainPRG), ;
  699.             this.cProjectDir)))
  700.     IF this.lCreateProjDir
  701.         lcPath=""
  702.         SELECT _appwiz
  703.         SCAN ALL FOR UPPER(RIGHTC(ALLTRIM(Type),10))==" DIRECTORY"
  704.             lcData1=STRTRAN(ALLTRIM(MLINE(Data1,1)),"\","")
  705.             IF EMPTY(lcData1)
  706.                 LOOP
  707.             ENDIF
  708.             lcPath=lcPath+";"+lcData1
  709.         ENDSCAN
  710.         lcPath=[SET PATH TO ]+lcPath
  711.     ELSE
  712.         lcPath=[SET PATH TO]
  713.     ENDIF
  714.     lcCode=STRTRAN(lcCode,"*<PATH>*",lcPath)
  715.     lcCode=STRTRAN(lcCode,CR,CR_LF)
  716.     CREATE CURSOR _temp000 (Code M)
  717.     APPEND BLANK
  718.     REPLACE Code with lcCode
  719.     COPY MEMO code to (this.cMainPRG)
  720.     USE
  721.     this.AddProjectItem(this.cMainPRG,,.T.)
  722.     ENDFUNC
  723.  
  724.  
  725.     FUNCTION UpdateMenu
  726.     LOCAL lcFileName,lcFileName2,lcAddFileName,lcFileExt,oNode,lcImage,lcKey
  727.     LOCAL lcLevelName,lcLevelName2,lcSubDir,lnAtPos,lnLastSelect
  728.  
  729.     lnLastSelect=SELECT()
  730.     SELECT 0
  731.     USE (this.cStartupMenu) EXCLUSIVE ALIAS _menu
  732.     IF NOT USED("_menu")
  733.         SELECT (lnLastSelect)
  734.         RETURN .F.
  735.     ENDIF
  736.     SET FILTER TO NOT DELETED()
  737.     LOCATE
  738.     this.nMenuCount=this.oPageFrame.Page4.oleMenuList.object.Nodes.Count
  739.     FOR lnCount = 1 TO this.nMenuCount
  740.         oNode=this.oPageFrame.Page4.oleMenuList.Nodes[lnCount]
  741.         lcImage=ALLTRIM(oNode.Image)
  742.         IF EMPTY(lcImage) OR lcImage=="menus"
  743.             LOOP
  744.         ENDIF
  745.         lcKey=LOWER(ALLTRIM(oNode.Key))
  746.         GO (this.oAppWiz.aMenus[lnCount])
  747.         lcLevelName=LOWER(ALLTRIM(MLINE(LevelName,1)))
  748.         DELETE
  749.         IF ObjCode=77
  750.             SKIP
  751.             IF ObjCode#0
  752.                 LOOP
  753.             ENDIF
  754.             lcLevelName2=LOWER(ALLTRIM(MLINE(LevelName,1)))
  755.             DELETE
  756.             DELETE ALL FOR LOWER(ALLTRIM(MLINE(LevelName,1)))==lcLevelName2
  757.         ENDIF
  758.         IF TYPE("oNode.parent.Key")=="C"
  759.             LOCATE FOR LOWER(ALLTRIM(MLINE(Name,1)))==lcLevelName
  760.             IF EOF()
  761.                 LOOP
  762.             ENDIF
  763.             IF NumItems>0
  764.                 REPLACE NumItems WITH NumItems-1
  765.             ENDIF
  766.             LOOP
  767.         ENDIF
  768.         GO 2
  769.         IF NumItems>0
  770.             REPLACE NumItems WITH NumItems-1
  771.         ENDIF
  772.     ENDFOR
  773.     oNode=.NULL.
  774.     this.nDocumentCount=this.oPageFrame.Page3.oleDocumentList.object.Nodes.Count
  775.     IF this.nDocumentCount=0
  776.         SELECT (lnLastSelect)
  777.         RETURN
  778.     ENDIF
  779.     FOR lnCount = 1 TO this.nDocumentCount
  780.         lcFileName=ALLTRIM(this.oPageFrame.Page3.oleDocumentList.object.Nodes[lnCount].Text)
  781.  
  782.         IF NOT "."$lcFileName
  783.             LOOP
  784.         ENDIF
  785.         IF NOT ":"$lcFileName
  786.             IF RIGHTC(lcFileName,LEN(M_STARTUP_MARKER_LOC))==M_STARTUP_MARKER_LOC
  787.                 lcFileName=LEFTC(lcFileName,LEN(lcFileName)-LEN(M_STARTUP_MARKER_LOC))
  788.                 this.cStartupForm=this.cProjectDir+this.GetDirName("forms")+lcFileName
  789.             ENDIF
  790.             LOOP
  791.         ENDIF
  792.         SET MESSAGE TO (this.cMessageText+":  "+lcFileName)
  793.         IF RIGHTC(lcFileName,LEN(M_STARTUP_MARKER_LOC))==M_STARTUP_MARKER_LOC
  794.             lcFileName=LEFTC(lcFileName,LEN(lcFileName)-LEN(M_STARTUP_MARKER_LOC))
  795.             this.cStartupForm=lcFileName
  796.         ENDIF
  797.         IF NOT RIGHTC(lcFileName,LEN(M_TEMPLATE_MARKER_LOC))==M_TEMPLATE_MARKER_LOC
  798.             this.AddProjectItem(lcFileName)
  799.             LOOP
  800.         ENDIF
  801.         lcFileName=LEFTC(lcFileName,LEN(lcFileName)-LEN(M_TEMPLATE_MARKER_LOC))
  802.         IF NOT FILE(lcFileName)
  803.             LOOP
  804.         ENDIF
  805.         lcSubDir=ALLTRIM(this.oAppWiz.TrimFile(lcFileName))
  806.         IF RIGHTC(lcSubDir,1)=="\"
  807.             lcSubDir=ALLTRIM(LEFTC(lcSubDir,LEN(lcSubDir)-1))
  808.         ENDIF
  809.         lnAtPos=RATC("\",lcSubDir)
  810.         IF lnAtPos>0
  811.             lcSubDir=ALLTRIM(SUBSTRC(lcSubDir,lnAtPos+1))
  812.         ENDIF
  813.         lcFileName2=LOWER(FULLPATH(this.oAppWiz.TrimPath(lcFileName), ;
  814.                 this.cProjectDir+this.GetDirName(lcSubDir)))
  815.         lnAtPos=RATC(".",lcFileName2)
  816.         lcFileExt=IIF(lnAtPos=0,"",LOWER(RIGHTC(lcFileName2,LEN(lcFileName2)-lnAtPos+1)))
  817.         IF INLIST(lcFileExt,".scx",".vcx",".frx",".lbx",".mnx",".dbf",".dbc",".pjx")
  818.             COPY FILE (lcFileName) TO (lcFileName2)
  819.             lcAddFileName=lcFileName2
  820.             IF lcFileExt==".dbf"
  821.                 lcFileExt=".fpt"
  822.                 lcFileName=LEFTC(lcFileName,LEN(lcFileName)-3)+"fpt"
  823.                 IF NOT FILE(lcFileName)
  824.                     LOOP
  825.                 ENDIF
  826.                 lcFileName2=LEFTC(lcFileName2,LEN(lcFileName2)-3)+"fpt"
  827.                 COPY FILE (lcFileName) TO (lcFileName2)
  828.                 this.AddProjectItem(lcAddFileName)
  829.                 LOOP
  830.             ENDIF
  831.             IF lcFileExt==".dbc"
  832.                 lcFileExt=".dcx"
  833.                 lcFileName=LEFTC(lcFileName,LEN(lcFileName)-3)+"dcx"
  834.                 IF NOT FILE(lcFileName)
  835.                     LOOP
  836.                 ENDIF
  837.                 lcFileName2=LEFTC(lcFileName2,LEN(lcFileName2)-3)+"dcx"
  838.                 COPY FILE (lcFileName) TO (lcFileName2)
  839.             ENDIF
  840.             lcFileName=LEFTC(lcFileName,LEN(lcFileName)-1)+"t"
  841.             IF NOT FILE(lcFileName)
  842.                 LOOP
  843.             ENDIF
  844.             lcFileName2=LEFTC(lcFileName2,LEN(lcFileName2)-1)+"t"
  845.             COPY FILE (lcFileName) TO (lcFileName2)
  846.             this.AddProjectItem(lcAddFileName)
  847.         ELSE
  848.             IF INLIST(lcFileExt,".sct",".vct",".frt",".lbt",".mnt",".fpt",".dct",".pjt")
  849.                 LOOP
  850.             ENDIF
  851.             COPY FILE (lcFileName) TO (lcFileName2)
  852.             IF INLIST(lcFileExt,".cdx")
  853.                 LOOP
  854.             ENDIF
  855.             this.AddProjectItem(lcFileName2)
  856.         ENDIF
  857.     ENDFOR
  858.     SET MESSAGE TO (this.cMessageText+" ...")
  859.     SELECT (lnLastSelect)
  860.     ENDFUNC
  861.  
  862.  
  863.     FUNCTION AddMenuItem(tcFileName,tcParam2,tcParam3,tcParam4)
  864.     LOCAL lcFileName,lcFileExt,lcName,lnRecNo,lnNumItems,lcLevelName,lcProperties
  865.     LOCAL lcPrompt,lcCommand,lcMark,lnAtPos,lnLastSelect,lcClassLoc,lcNewClassLoc
  866.  
  867.     IF EMPTY(tcFileName) OR NOT USED("_menu")
  868.         RETURN .F.
  869.     ENDIF
  870.     lnLastSelect=SELECT()
  871.     lcFileName=this.oAppWiz.TrimPath(tcFileName)
  872.     lnAtPos=RATC(".",lcFileName)
  873.     lcFileExt=IIF(lnAtPos=0,"",LOWER(RIGHTC(lcFileName,LEN(lcFileName)-lnAtPos+1)))
  874.     IF INLIST(lcFileExt,".sct",".vct",".frt",".lbt",".mnt",".fpt",".dct",".pjt")
  875.         SELECT (lnLastSelect)
  876.         RETURN .F.
  877.     ENDIF
  878.     lcPrompt=""
  879.     IF USED("_templatedbf")
  880.         SELECT _templatedbf
  881.         LOCATE FOR LOWER(ALLTRIM(MLINE(Name,1)))==LOWER(lcFileName)
  882.         IF NOT EOF()
  883.             lcProperties=STRTRAN(STRTRAN(ALLTRIM(Properties),CR_LF,CR),CR+CR,CR)
  884.             IF EMPTY(lcProperties)
  885.                 LOOP
  886.             ENDIF
  887.             lcProperties=CR+ALLTRIM(lcProperties)+CR
  888.             IF ATCC(CR+"nomenu"+CR,lcProperties)>0
  889.                 SELECT (lnLastSelect)
  890.                 RETURN .F.
  891.             ENDIF
  892.             lnAtPos=AT_C(CR+"menucaption=",lcProperties)
  893.             IF lnAtPos=0
  894.                 lnAtPos=ATCC(CR+"menucaption =",lcProperties)
  895.             ENDIF
  896.             IF lnAtPos>0
  897.                 lcPrompt=ALLTRIM(MLINE(SUBSTRC(lcProperties,lnAtPos+1),1))
  898.                 lnAtPos=AT_C("=",lcPrompt)
  899.                 lcPrompt=ALLTRIM(SUBSTRC(lcPrompt,lnAtPos+1))
  900.             ENDIF
  901.             DO CASE
  902.                 CASE lcFileExt==".scx"
  903.                     IF ATCC(CR+"nomultipleinstances"+CR,lcProperties)>0
  904.                         tcParam3=".T."
  905.                     ENDIF
  906.                     IF ATCC(CR+"noshow"+CR,lcProperties)>0
  907.                         tcParam4=".T."
  908.                     ENDIF
  909.                 CASE lcFileExt==".frx"
  910.                     IF ATCC(CR+"nopreview"+CR,lcProperties)>0
  911.                         tcParam2=".T."
  912.                     ENDIF
  913.             ENDCASE
  914.         ENDIF
  915.         SELECT (lnLastSelect)
  916.     ENDIF
  917.     lcParams=""
  918.     IF NOT EMPTY(tcParam2)
  919.         lcParams=lcParams+","+tcParam2
  920.     ENDIF
  921.     IF NOT EMPTY(tcParam3)
  922.         lcParams=lcParams+","+tcParam3
  923.     ENDIF
  924.     IF NOT EMPTY(tcParam4)
  925.         lcParams=lcParams+","+tcParam4
  926.     ENDIF
  927.     IF lcFileExt==".scx" OR lcFileExt==".vcx"
  928.         SELECT 0
  929.         USE (tcFileName) AGAIN SHARED ALIAS _vcxscxdata
  930.         IF USED("_vcxscxdata")
  931.             SCAN ALL FOR NOT EMPTY(ClassLoc)
  932.                 lcClassLoc=LOWER(ALLTRIM(ClassLoc))
  933.                 IF NOT "\"$lcClassLoc OR lcClassLoc==this.oAppWiz.TrimPath(lcClassLoc) OR ;
  934.                         LEFTC(lcClassLoc,8)=="..\libs\"
  935.                     LOOP
  936.                 ENDIF
  937.                 lcClassLoc=LOWER(FULLPATH(lcClassLoc,tcFileName))
  938.                 lcNewClassLoc=LOWER(ALLTRIM(SYS(2014,HOME()+"wizards\"+ ;
  939.                         this.oAppWiz.TrimPath(lcClassLoc), ;
  940.                         this.cProjectDir+this.GetDirName("forms"))))
  941.                 IF lcClassLoc==lcNewClassLoc
  942.                     LOOP
  943.                 ENDIF
  944.                 CLEAR CLASS (MLINE(Class,1))
  945.                 REPLACE ClassLoc WITH lcNewClassLoc
  946.             ENDSCAN
  947.             USE
  948.         ENDIF
  949.         SELECT (lnLastSelect)
  950.     ENDIF
  951.     DO CASE
  952.         CASE lcFileExt==".scx"
  953.             lcName="Forms"
  954.             lcCommand=[goApp.DoForm("]+LOWER(SYS(2014,tcFileName,this.cProjectDir))+ ;
  955.                     lcParams+[")]
  956.             IF EMPTY(lcPrompt)
  957.                 SELECT 0
  958.                 USE (tcFileName) AGAIN SHARED
  959.                 IF NOT USED()
  960.                     SELECT (lnLastSelect)
  961.                     RETURN .F.
  962.                 ENDIF
  963.                 SET FILTER TO NOT DELETED()
  964.                 LOCATE FOR LOWER(LEFTC(BaseClass,4))=="form" OR LOWER(BaseClass)=="toolbar"
  965.                 lcPrompt=ALLTRIM(Properties)
  966.                 lnAtPos=ATCC(LF+"Caption = ",lcPrompt)
  967.                 IF lnAtPos=0
  968.                     lcPrompt=this.oAppWiz.TrimExt(lcFileName)
  969.                 ELSE
  970.                     lcPrompt=MLINE(SUBSTRC(lcPrompt,lnAtPos+10),1)
  971.                     lcPrompt=EVALUATE(lcPrompt)
  972.                 ENDIF
  973.                 USE
  974.             ENDIF
  975.         CASE lcFileExt==".frx" OR lcFileExt==".lbx"
  976.             lcName="Reports"
  977.             lcCommand=[goApp.Do]+IIF(lcFileExt==".frx","Report","Label")+ ;
  978.                     [("]+LOWER(SYS(2014,tcFileName,this.cProjectDir))+lcParams+[")]
  979.             IF EMPTY(lcPrompt)
  980.                 SELECT 0
  981.                 USE (tcFileName) AGAIN SHARED
  982.                 IF NOT USED()
  983.                     SELECT (lnLastSelect)
  984.                     RETURN .F.
  985.                 ENDIF
  986.                 SET FILTER TO NOT DELETED()
  987.                 LOCATE FOR ObjType=5
  988.                 lcPrompt=ALLTRIM(Expr)
  989.                 IF MEMLINES(lcPrompt)>1
  990.                     lcPrompt=MLINE(lcPrompt,1)+["]
  991.                 ENDIF
  992.                 IF NOT EMPTY(lcPrompt)
  993.                     lcPrompt=EVALUATE(lcPrompt)
  994.                 ENDIF
  995.                 IF EMPTY(lcPrompt)
  996.                     lcPrompt=this.oAppWiz.TrimExt(lcFileName)
  997.                 ENDIF
  998.                 USE
  999.             ENDIF
  1000.         OTHERWISE
  1001.             SELECT (lnLastSelect)
  1002.             RETURN .F.
  1003.     ENDCASE
  1004.     SELECT _menu
  1005.     LOCATE FOR ALLTRIM(MLINE(Name,1))==lcName
  1006.     IF EOF()
  1007.         SELECT (lnLastSelect)
  1008.         RETURN .F.
  1009.     ENDIF
  1010.     lnRecNo=RECNO()
  1011.     lnNumItems=NumItems+1
  1012.     lcMark=Mark
  1013.     lcLevelName=LevelName
  1014.     REPLACE NumItems WITH lnNumItems
  1015.     SKIP (lnNumItems-1)
  1016.     INSERT BLANK
  1017.     REPLACE ObjType WITH 3, ;
  1018.             ObjCode WITH 67, ;
  1019.             Prompt WITH lcPrompt, ;
  1020.             Command WITH lcCommand, ;
  1021.             Mark WITH lcMark, ;
  1022.             LevelName WITH lcLevelName, ;
  1023.             ItemNum WITH TRANSFORM(lnNumItems,"###")
  1024.     SELECT (lnLastSelect)
  1025.     ENDFUNC
  1026.     
  1027.  
  1028.     FUNCTION GetDirName(tcKey)
  1029.     LOCAL lcFullKey,lcDirName,lnLastSelect
  1030.  
  1031.     IF EMPTY(tcKey) OR NOT this.lCreateProjDir
  1032.         RETURN ""
  1033.     ENDIF
  1034.     lcFullKey=UPPER(ALLTRIM(tcKey))+" DIRECTORY"
  1035.     lnLastSelect=SELECT()
  1036.     SELECT _appwiz
  1037.     LOCATE FOR UPPER(ALLTRIM(Type))==lcFullKey
  1038.     IF EOF()
  1039.         lcDirName=""
  1040.     ELSE
  1041.         lcDirName=ALLTRIM(MLINE(Data1,1))
  1042.         IF LEFTC(lcDirName,1)=="\"
  1043.             lcDirName=ALLTRIM(SUBSTRC(lcDirName,2))
  1044.         ENDIF
  1045.         IF NOT RIGHTC(lcDirName,1)=="\"
  1046.             lcDirName=lcDirName+"\"
  1047.         ENDIF
  1048.     ENDIF
  1049.     SELECT (lnLastSelect)
  1050.     RETURN lcDirName
  1051.     ENDFUNC
  1052.  
  1053.  
  1054.     FUNCTION AddProjectItem(tcFileName,tlExclude,tlMainProg,tlSkipScan,tlNoMenu)
  1055.     LOCAL lcFileName,llExclude,lcFileName2,lcType,lnLastSelect,lnLastRecNo
  1056.     LOCAL lcAlias,lnAtPos,lnParms
  1057.     lnParms = PCOUNT()
  1058.     lcFileName=LOWER(ALLTRIM(tcFileName))
  1059.     llExclude=tlExclude
  1060.     lnAtPos=RATC(".",lcFileName)
  1061.     lnLastSelect=SELECT()
  1062.     lcFileExt=IIF(lnAtPos=0,"",LOWER(RIGHTC(lcFileName,LEN(lcFileName)-lnAtPos+1)))
  1063.     DO CASE
  1064.         CASE lcFileExt==".scx"
  1065.             lcType="K"
  1066.         CASE lcFileExt==".frx"
  1067.             lcType="R"
  1068.         CASE lcFileExt==".lbx"
  1069.             lcType="B"
  1070.         CASE lcFileExt==".mnx"
  1071.             lcType="M"
  1072.         CASE lcFileExt==".vcx"
  1073.             lcType="V"
  1074.         CASE lcFileExt==".prg"
  1075.             lcType="P"
  1076.         CASE INLIST(lcFileExt,".txt",".h",".log",".fpw")
  1077.             lcType="T"
  1078.         CASE lcFileExt==".qpr"
  1079.             lcType="Q"
  1080.         CASE lcFileExt==".dbf"
  1081.             IF ASCAN(this.aDBC,LOWER(this.oAppWiz.TrimPath(lcFileName)))>0
  1082.                 RETURN .F.
  1083.             ENDIF
  1084.             lcType="D"
  1085.             IF lnParms < 2
  1086.                 llExclude=.T.
  1087.             ENDIF
  1088.         CASE lcFileExt==".dbc"
  1089.             lcType="d"
  1090.             llExclude=.T.
  1091.         CASE lcFileExt==".fll"
  1092.             lcType="L"
  1093.         CASE lcFileExt==".app"
  1094.             lcType="Z"
  1095.         OTHERWISE
  1096.             lcType="x"
  1097.     ENDCASE
  1098.     SELECT _project
  1099.     LOCATE FOR LOWER(Name)==LOWER(lcFileName+EOL)
  1100.     IF EOF()
  1101.         APPEND BLANK
  1102.     ENDIF
  1103.     REPLACE Type WITH lcType, Name WITH lcFileName+EOL, ;
  1104.             Exclude WITH llExclude, MainProg WITH tlMainProg
  1105.     IF NOT tlNoMenu AND INLIST(lcFileExt,".scx",".frx",".lbx",".h")
  1106.         this.AddMenuItem(lcFileName)
  1107.     ENDIF
  1108.     IF tlSkipScan OR (NOT lcType=="K" AND NOT lcType=="V")
  1109.         SELECT (lnLastSelect)
  1110.         RETURN
  1111.     ENDIF
  1112.     SELECT 0
  1113.     lcAlias=" _metafile_"+this.oAppWiz.TrimPath(lcFileName,.T.)+"_"+STRTRAN(lcFileExt,".","")
  1114.     lcAlias=CHRTRAN(lcAlias,". ","__")
  1115.     IF USED(lcAlias)
  1116.         SELECT (lnLastSelect)
  1117.         RETURN
  1118.     ENDIF
  1119.     USE (lcFileName) AGAIN SHARED ALIAS (lcAlias)
  1120.     IF NOT USED()
  1121.         SELECT (lnLastSelect)
  1122.         RETURN
  1123.     ENDIF
  1124.     SCAN ALL
  1125.         IF NOT EMPTY(ClassLoc)
  1126.             lcFileName2=LOWER(FULLPATH(ALLTRIM(MLINE(ClassLoc,1)),lcFileName))
  1127.             IF NOT lcFileName2==lcFileName AND FILE(lcFileName2)
  1128.                 lnLastRecNo=RECNO()
  1129.                 this.AddProjectItem(lcFileName2)
  1130.                 SELECT (lcAlias)
  1131.                 GO (lnLastRecNo)
  1132.             ENDIF
  1133.         ENDIF
  1134.         IF NOT EMPTY(Reserved8)
  1135.             lcFileName2=LOWER(FULLPATH(ALLTRIM(MLINE(Reserved8,1)),lcFileName))
  1136.             IF NOT lcFileName2==lcFileName AND FILE(lcFileName2)
  1137.                 lnLastRecNo=RECNO()
  1138.                 this.AddProjectItem(lcFileName2,.T.)
  1139.                 SELECT (lcAlias)
  1140.                 GO (lnLastRecNo)
  1141.             ENDIF
  1142.         ENDIF
  1143.     ENDSCAN
  1144.     USE
  1145.     SELECT (lnLastSelect)
  1146.     ENDFUNC
  1147.  
  1148.  
  1149.     FUNCTION Error
  1150.     LPARAMETERS nError, cMethod, nLine
  1151.     LOCAL lcErrorMsg,lcCodeLineMsg
  1152.  
  1153.     WAIT CLEAR
  1154.     IF this.lError
  1155.         RELEASE this
  1156.         RETURN .F.
  1157.     ENDIF
  1158.     IF this.lBuildMode
  1159.         RETURN
  1160.     ENDIF
  1161.     lcErrorMsg=MESSAGE()+CR+CR+M_APPLICATION_WIZARD_LOC+":   "+this.Name+CR
  1162.     lcErrorMsg=lcErrorMsg+"Method:    "+cMethod
  1163.     lcCodeLineMsg=MESSAGE(1)
  1164.     IF BETWEEN(nLine,1,10000) AND NOT lcCodeLineMsg="..."
  1165.         lcErrorMsg=lcErrorMsg+CR+"Line:         "+ALLTRIM(STR(nLine))
  1166.         IF NOT EMPTY(lcCodeLineMsg)
  1167.             lcErrorMsg=lcErrorMsg+CR+CR+lcCodeLineMsg
  1168.         ENDIF
  1169.     ENDIF
  1170.     IF MESSAGEBOX(lcErrorMsg,17,"Application Wizard")#1
  1171.         this.lError=.T.
  1172.         RELEASE this
  1173.         RETURN .F.
  1174.     ENDIF
  1175.     ENDFUNC
  1176.  
  1177.     *** New VFP98 Framework functions ***
  1178.     FUNCTION UpdateProjectNew
  1179.  
  1180.         LOCAL lcGoMenu, lcReadMe, lcLogFile, lcConfFile, lcCommonName, ;
  1181.             liSelect, lcMetaTable, lcTempString, lcAlias, ;
  1182.             lcMainMenu, lcTopMenu, lcAppendMenu, lcTopGoMenu
  1183.         
  1184.         WAIT WINDOW APPGENERATING_LOC NOWAIT
  1185.         * determine the filenames for the pieces we will generate:
  1186.         lcCommonName = JUSTSTEM(THIS.cMainPJX)+APP_BUILDER_FILE_SUFFIX
  1187.         lcMainMenu = THIS.cProjectDir+THIS.GetDirName("menus")+ ;
  1188.                           STRTRAN(lcCommonName,;
  1189.                                 APP_BUILDER_FILE_SUFFIX,;
  1190.                                 APP_BUILDER_MAINMENU_SUFFIX)+".MNX"                            
  1191.         lcGoMenu =         STRTRAN(lcMainMenu, ;
  1192.                                 APP_BUILDER_MAINMENU_SUFFIX, ;
  1193.                                 APP_BUILDER_GOMENU_SUFFIX)
  1194.         lcTopMenu =     STRTRAN(lcMainMenu, ;
  1195.                                 APP_BUILDER_MAINMENU_SUFFIX, ;
  1196.                                 APP_BUILDER_TOPMENU_SUFFIX)
  1197.         lcAppendMenu =     STRTRAN(lcMainMenu, ;
  1198.                                 APP_BUILDER_MAINMENU_SUFFIX, ;
  1199.                                 APP_BUILDER_APPENDMENU_SUFFIX)
  1200.  
  1201.         THIS.cMainH = THIS.cProjectDir+lcCommonName+".H"
  1202.         lcConfigFile = THIS.cProjectDir+"CONFIG.FPW"
  1203.         THIS.cMainVCX=THIS.cProjectDir+THIS.GetDirName("libs")+ ;
  1204.             lcCommonName+".VCX"
  1205.  
  1206.         THIS.cStartupMenu = lcMainMenu
  1207.  
  1208.         THIS.cMainPRG=THIS.cProjectDir+THIS.GetDirName("progs")+ ;
  1209.             lcCommonName+".PRG"
  1210.         lcReadMe = FORCEEXT(THIS.cMainH,"HTM")
  1211.         lcLogFile = FORCEEXT(THIS.cMainH,"LOG")
  1212.         lcMetaTable = FORCEEXT(THIS.cMainH,"DBF")
  1213.  
  1214.         * create the meta table:
  1215.         liSelect = SELECT()    
  1216.         lcAlias = "F"+SYS(2015)
  1217.         SELECT 0
  1218.         USE (THIS.cWizardDir2+"_framewk.dbf") AGAIN SHARED ALIAS (lcAlias)
  1219.         LOCATE FOR ALLTR(LOWER(fname)) == "t_head.txt"
  1220.         THIS.cHeaderText = contents
  1221.         LOCATE FOR ALLTR(LOWER(fname)) == "t_meta.dbf"
  1222.         COPY MEMO Contents TO (LOWER(lcMetaTable))
  1223.         LOCATE FOR ALLTR(LOWER(fname)) == "t_meta.fpt"
  1224.         COPY MEMO Contents TO (LOWER(FORCEEXT(lcMetaTable,"FPT")))
  1225.         LOCATE FOR ALLTR(LOWER(fname)) == "t_meta.cdx"    
  1226.         COPY MEMO Contents TO (LOWER(FORCEEXT(lcMetaTable,"CDX")))
  1227.  
  1228.         * create the header file:
  1229.         LOCATE FOR ALLTR(LOWER(fname)) == "t_meta.h"        
  1230.         lcTempString = Contents
  1231.         * first do the standard fix for project name and header info:
  1232.         lcTempString = THIS.AdjustString(lcTempString)
  1233.         * now do the .H-file-specific stuff:
  1234.         lcTempString = THIS.AdjustString(lcTempString, "*<AppClassName>*", APP_BUILDER_CLASS_PREFIX+"_application")
  1235.         * for now, all the following are set here, but they would
  1236.         * be set by the appbuilder:
  1237.         lcTempString = THIS.AdjustString(lcTempString,"*<AppName>*",THIS.cProjectName) && for now
  1238.         lcTempString = THIS.AdjustString(lcTempString,"*<AppSplashClass>*",APP_BUILDER_CLASS_PREFIX+"_splash")
  1239.  
  1240.         STRTOFILE(lcTempString,LOWER(THIS.cMainH))
  1241.  
  1242.         * create the ancillary textfiles and adjust appropriately with headers etc:
  1243.  
  1244.         * config.fpw
  1245.         LOCATE FOR ALLTR(LOWER(fname)) == "t_config.fpw"        
  1246.         lcTempString = Contents
  1247.         * first do the standard fix for project name and header info:
  1248.         lcTempString = THIS.AdjustString(lcTempString)
  1249.         * then there is one item, TITLE=, that gets more customized in this file:
  1250.         lcTempString = THIS.AdjustString(lcTempString,"*<AppName>*",THIS.cProjectName) && for now
  1251.         STRTOFILE(lcTempString,LOWER(lcConfigFile))
  1252.  
  1253.         * project hook action log
  1254.         LOCATE FOR ALLTR(LOWER(fname)) == "t_log.txt"
  1255.         lcTempString = Contents
  1256.         * standard fix for project name and header info:
  1257.         lcTempString = THIS.AdjustString(lcTempString)
  1258.         STRTOFILE(lcTempString,LOWER(lcLogFile))
  1259.  
  1260.         * create the program to instantiate the app object:
  1261.         LOCATE FOR ALLTR(LOWER(fname)) == "t_start.prg"
  1262.         lcTempString = Contents
  1263.         * standard fix for project name and header info:
  1264.         lcTempString = THIS.AdjustString(lcTempString)
  1265.         STRTOFILE(lcTempString,LOWER(THIS.cMainPRG))
  1266.  
  1267.         * create the application classlibrary and its subclasses of _FRAMEWK:
  1268.         LOCATE FOR ALLTR(LOWER(fname)) == "t_meta.vcx"    
  1269.         COPY MEMO Contents TO (LOWER(THIS.cMainVCX))
  1270.         LOCATE FOR ALLTR(LOWER(fname)) == "t_meta.vct"    
  1271.         COPY MEMO Contents TO (LOWER(FORCEEXT(THIS.cMainVCX,"VCT")))
  1272.        
  1273.         * create menus
  1274.         LOCATE FOR ALLTR(LOWER(fname)) == "t_main.mnx"    
  1275.         COPY MEMO Contents TO (LOWER(lcMainMenu))
  1276.         LOCATE FOR ALLTR(LOWER(fname)) == "t_main.mnt"    
  1277.         COPY MEMO Contents TO (LOWER(FORCEEXT(lcMainMenu,"MNT")))
  1278.         
  1279.         LOCATE FOR ALLTR(LOWER(fname)) == "t_top.mnx"    
  1280.         COPY MEMO Contents TO (LOWER(lcTopMenu))
  1281.         LOCATE FOR ALLTR(LOWER(fname)) == "t_top.mnt"    
  1282.         COPY MEMO Contents TO (LOWER(FORCEEXT(lcTopMenu,"MNT")))
  1283.         
  1284.         LOCATE FOR ALLTR(LOWER(fname)) == "t_append.mnx"    
  1285.         COPY MEMO Contents TO (LOWER(lcAppendMenu))
  1286.         LOCATE FOR ALLTR(LOWER(fname)) == "t_append.mnt"    
  1287.         COPY MEMO Contents TO (LOWER(FORCEEXT(lcAppendMenu,"MNT")))
  1288.         
  1289.         LOCATE FOR ALLTR(LOWER(fname)) == "t_go.mnx"
  1290.         COPY MEMO Contents TO (LOWER(lcGoMenu))
  1291.         LOCATE FOR ALLTR(LOWER(fname)) == "t_go.mnt"
  1292.         COPY MEMO Contents TO (LOWER(FORCEEXT(lcGoMenu,"MNT")))
  1293.         
  1294.         * adjust these menus with appropriate header info...
  1295.  
  1296.         THIS.UpdateMenuNew(lcMainMenu)
  1297.         THIS.UpdateMenuNew(lcTopMenu)
  1298.         THIS.UpdateMenuNew(lcAppendMenu)        
  1299.         THIS.UpdateMenuNew(lcGoMenu)
  1300.         
  1301.         * Now adjust subclass vcx,properties of application object, and 
  1302.         * potentially properties of splash class and other subclasses if we want...
  1303.         
  1304.         USE (THIS.cMainVCX) ALIAS (lcAlias)
  1305.         REPLACE ALL ClassLoc WITH LOWER(THIS.cWizardDir2+"_framewk.vcx") ;
  1306.                 FOR NOT EMPTY(ClassLoc)
  1307.         REPLACE ALL ObjName WITH LOWER(APP_BUILDER_CLASS_PREFIX+ObjName) ;
  1308.                 FOR NOT EMPTY(ObjName)
  1309.                 
  1310.         LOCATE FOR ALLTR(LOWER(objName)) == LOWER(APP_BUILDER_CLASS_PREFIX+"_application") ;
  1311.             AND NOT DELETED()
  1312.             
  1313.         THIS.AdjustProperties("cCaption",ALLTRIM(THIS.cProjectName))
  1314.         THIS.AdjustProperties("cgomenufile",JUSTSTEM(lcGoMenu))
  1315.         THIS.AdjustProperties("cstartupmenu",JUSTSTEM(THIS.cStartupMenu))
  1316.         THIS.AdjustProperties("cmetatable",JUSTSTEM(lcMetaTable))
  1317.         THIS.AdjustProperties("caboutboxclass",APP_BUILDER_CLASS_PREFIX+"_aboutbox")
  1318.         THIS.AdjustProperties("cerrorviewerclass",APP_BUILDER_CLASS_PREFIX+"_errorlogviewer")
  1319.         THIS.AdjustProperties("cstartupformclass",APP_BUILDER_CLASS_PREFIX+"_favoritepicker")
  1320.         THIS.AdjustProperties("cnavtoolbarclass",APP_BUILDER_CLASS_PREFIX+"_navtoolbar")
  1321.         THIS.AdjustProperties("cstartuptoolbarclass",APP_BUILDER_CLASS_PREFIX+"_standardtoolbar")
  1322.         THIS.AdjustProperties("cnewopenclass",APP_BUILDER_CLASS_PREFIX+"_newopen")
  1323.         THIS.AdjustProperties("coptionsdialogclass",APP_BUILDER_CLASS_PREFIX+"_options")
  1324.         THIS.AdjustProperties("creportdialogclass",APP_BUILDER_CLASS_PREFIX+"_reportpicker")
  1325.         THIS.AdjustProperties("cuserloginclass",APP_BUILDER_CLASS_PREFIX+"_userlogin")
  1326.         THIS.AdjustProperties("cchangepasswordclass",APP_BUILDER_CLASS_PREFIX+"_changepassword")
  1327.  
  1328.         USE
  1329.         SELECT (liSelect)        
  1330.  
  1331.         IF THIS.lExistingDatabase AND NOT EMPTY(THIS.cExistingDatabase)
  1332.             THIS.AddProjectItem(THIS.cExistingDatabase,.T.)
  1333.         ENDIF
  1334.  
  1335.         THIS.AddProjectItem(THIS.cMainH,.T.)
  1336.         THIS.AddProjectItem(lcMetaTable,.F.)
  1337.         THIS.AddProjectItem(lcConfigFile,.T.)
  1338.         THIS.AddProjectItem(lcLogFile,.T.)
  1339.         THIS.AddProjectItem(THIS.cMainVCX)
  1340.         THIS.AddProjectItem(THIS.cStartupMenu)
  1341.         THIS.AddProjectItem(lcGoMenu)
  1342.         THIS.AddProjectItem(THIS.cMainPRG,,.T.)
  1343.         THIS.AddProjectItem(HOME()+REPORTS_CLASSLIB)
  1344.         WAIT CLEAR
  1345.     ENDFUNC
  1346.  
  1347.     FUNCTION UpdateMenuNew(tcMenu)
  1348.         IF EMPTY(tcMenu)
  1349.             RETURN
  1350.         ENDIF
  1351.         LOCAL liSelect
  1352.         liSelect = SELECT()
  1353.         SELE 0
  1354.         USE (tcMenu) AGAIN SHARED
  1355.         REPLACE Setup WITH THIS.AdjustString(ALLTR(Setup))
  1356.         USE
  1357.         SELECT (liSelect)
  1358.     ENDFUNC
  1359.  
  1360.     FUNCTION AdjustProperties(tcProperty,tvValue)
  1361.         * this function assumes that you are pointed
  1362.         * at the right record of a VCX already....
  1363.         ASSERT TYPE(ALIAS()+".Properties") = "M" AND NOT EOF()
  1364.         IF TYPE("tcProperty") # "C" OR EMPTY(tcProperty)
  1365.             RETURN
  1366.         ENDIF
  1367.         LOCAL liLines, lcProperties, lcValue, ;
  1368.             llFound, liPos, lcLine, liIndex, lcNewLine
  1369.         liLines = MEMLINES(Properties)
  1370.         lcProperties = Properties
  1371.         _MLINE = 0
  1372.         DO CASE
  1373.             CASE PCOUNT() < 2
  1374.                 lcValue = NULL
  1375.             CASE TYPE("tvValue") = "C"
  1376.                 lcValue = ALLTRIM(tvValue)
  1377.             OTHERWISE
  1378.                 lcValue = TRANSFORM(tvValue)
  1379.         ENDCASE
  1380.  
  1381.         FOR liIndex = 1 TO liLines
  1382.             lcLine = MLINE(lcProperties, 1, _MLINE)
  1383.             IF NOT EMPTY(ATC(tcProperty+" =",lcLine))
  1384.                 IF ISNULL(lcValue) && resettodefault
  1385.                     lcProperties = STRTRAN(lcProperties,lcLine+CHR(13)+CHR(10),"")
  1386.                 ELSE
  1387.                     liPos = ATC("=",lcLine)
  1388.                     lcNewLine = SUBSTR(lcLine,1,liPos)+" "+lcValue
  1389.                     lcProperties = STRTRAN(lcProperties,lcLine,lcNewLine)
  1390.                 ENDIF
  1391.                 llFound = .T.
  1392.                 EXIT
  1393.             ENDIF
  1394.         ENDFOR
  1395.         IF NOT llFound && add this information at the bottom
  1396.             lcProperties = lcProperties+ ;
  1397.                 ALLTR(tcProperty)+" = "+lcValue + ;
  1398.                 CHR(13)+CHR(10)
  1399.         ENDIF
  1400.  
  1401.         REPLACE Properties WITH lcProperties
  1402.  
  1403.         RETURN
  1404.     ENDFUNC
  1405.  
  1406.     FUNCTION AdjustString(tcString,tcMetaString,tcReplacement)
  1407.         LOCAL lcString, lcHeaderText
  1408.         ASSERT LOWER(DBF()) == LOWER(THIS.cWizardDir2+"_framewk.dbf")
  1409.         IF EMPTY(tcString)
  1410.             RETURN
  1411.         ENDIF
  1412.         IF EMPTY(tcMetaString)
  1413.             lcString = STRTRAN(tcString,"*<PATHED_PROJECTNAME>*",UPPER(FORCEEXT(THIS.cMainPJX,"")))
  1414.             lcString = STRTRAN(lcString,"*<STANDARD HEADER>*", THIS.cHeaderText)
  1415.             lcString = STRTRAN(lcString,"*<PROJECTNAME>*",UPPER(JUSTSTEM(THIS.cMainPJX)))
  1416.         ELSE
  1417.             IF EMPTY(tcReplacement)
  1418.                 lcString = STRTRAN(tcString, tcMetaString)
  1419.             ELSE
  1420.                 lcString = STRTRAN(tcString, tcMetaString,tcReplacement)
  1421.             ENDIF
  1422.         ENDIF
  1423.         RETURN lcString
  1424.     ENDFUNC
  1425.  
  1426.     *** New VFP98 Framework functions ***
  1427.  
  1428. ENDDEFINE
  1429.